package com.yaolonga.itfc.manager.core;

import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.ServiceLoader;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: yaolong
 * @CreateTime: 2024-10-26  13:53
 * @Description: 接口管理器注册中心
 * @Version: 1.0
 */
@Slf4j
public class InterfaceManagerRegistry {
    private final static Map<String, Map<String, NetworkInterfaceManager>> registryStore = new ConcurrentHashMap<>();

    // spi
    static {
        try {
            ServiceLoader<NetworkInterfaceManager> load = ServiceLoader.load(NetworkInterfaceManager.class);
            for (NetworkInterfaceManager manager : load) {
                registryStore.computeIfAbsent(manager.getPlatformType().name(), k -> new ConcurrentHashMap<>()).put(manager.getSystemType().name(), manager);
            }
        } catch (Exception e) {
            log.error("加载网络接口管理器失败 {}", e.getMessage(), e);
        }
    }

    /**
     * 根据平台类型、系统类型获取对应的网络接口管理器
     *
     * @param platformType  平台类型
     * @param systemType    系统类型
     * @param systemVersion 系统版本号
     * @return 网络接口管理器
     */
    public static NetworkInterfaceManager getInterfaceManager(PlatformType platformType, SystemType systemType, String systemVersion) {
        return getInterfaceManager(platformType.name(), systemType.name(), systemVersion);
    }

    /**
     * 根据平台类型、系统类型、系统版本号获取对应的网络接口管理器
     *
     * @param platformType  平台类型
     * @param systemType    系统类型
     * @param systemVersion 系统版本号
     * @return 网络接口管理器
     */
    public static NetworkInterfaceManager getInterfaceManager(String platformType, String systemType, String systemVersion) {
        if (platformType == null || systemType == null) {
            return null;
        }
        Map<String, NetworkInterfaceManager> pMap = registryStore.get(platformType);
        if (pMap == null) {
            throw new RuntimeException("不支持的平台类型：【" + platformType + "】");
        }

        NetworkInterfaceManager networkInterfaceManager = pMap.get(systemType);
        if (networkInterfaceManager == null) {
            throw new RuntimeException("不支持的系统类型：【" + systemType + "】");
        }

        boolean supportVersion = networkInterfaceManager.getSystemType().isSupportVersion(systemVersion);
        if (!supportVersion) {
            throw new RuntimeException(systemType + "不支持系统版本号: 【" + systemVersion + "】");
        }
        return networkInterfaceManager;
    }
}
